package com.example.d6_homework.homework06;

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        // 需求：模仿windows中的,Ctrl + C和Ctrl + V功能,编写一个文件复制程序
        // 创建File对象srcDir,代表源文件夹
        File srcDir = new File("D:\\File\\temp");
        // 创建File对象destDir,代表目标文件夹(把源文件夹拷贝到目标文件夹中)
        File destDir = new File("D:\\File\\temp1");
        // 调用copyDirToDir方法,传递源文件夹和目标文件夹,完成文件夹的复制
        copyDirToDir(srcDir, destDir);
        System.out.println("文件夹复制完毕!!!");
    }

    /**
     * 复制文件夹到文件夹
     *
     * @param srcDir  源文件夹
     * @param destDir 目标文件夹
     * @throws IOException 如果文件读写发生错误
     */
    public static void copyDirToDir(File srcDir, File destDir) throws IOException {
        // 1.获取源文件夹的所有一级文件对象
        File[] files = srcDir.listFiles();
        if (files == null) {
            return;
        }

        // 2.遍历一级文件对象
        for (File file : files) {
            // 判断这个file是文件还是文件夹
            if (file.isFile()) {
                // 如果是文件复制文件到文件夹
                copyFile(file, destDir);
            } else {
                // 说明不是文件拷贝文件夹到文件夹,使用递归创建文件夹
                // 进入这个分值,就说明是文件夹,因此file.getName取出的就是文件夹的名称
                File newDestDir = new File(destDir, file.getName());
                if (!newDestDir.exists()) {
                    // 确保源文件夹中的文件夹子啊目标文件夹中的源文件夹中存在
                    newDestDir.mkdirs();
                }
                copyDirToDir(file, newDestDir);
            }
        }
    }

    /**
     * 复制文件到文件夹
     *
     * @param srcFile 源文件
     * @param destDir 目标文件夹
     * @throws IOException 如果文件读写发生错误
     */
    public static void copyFile(File srcFile, File destDir) throws IOException {
        // 注意要指向：目标文件的路径,不是目标文件夹
        File destFile = new File(destDir, srcFile.getName());
        try (
                InputStream is = new FileInputStream(srcFile);
                OutputStream os = new FileOutputStream(destFile)
        ) {
            int len;
            byte[] bytes = new byte[1024];
            while ((len = is.read(bytes)) != -1) {
                os.write(bytes, 0, len);
            }
            System.out.println("已复制文件：" + srcFile.getAbsolutePath() + " 到 " + destFile.getAbsolutePath());
        }
    }
}
